// +----------------------------------------------------------------------
// | CRMEB [ CRMEB赋能开发者，助力企业发展 ]
// +----------------------------------------------------------------------
// | Copyright (c) 2016~2024 https://www.crmeb.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed CRMEB并不是自由软件，未经许可不能去掉CRMEB相关版权
// +----------------------------------------------------------------------
// | Author: CRMEB Team <admin@crmeb.com>
// +----------------------------------------------------------------------

import request from "../utils/request.js";
import {
	HTTP_REQUEST_URL,
	TOKENNAME,
	API_PREFIX
} from '../config/app.js';
import store from '../store/index.js';
import {
	toLogin,
	checkLogin
} from '../libs/login.js';

/**
 * 文件上传场景枚举
 */
export const UploadScene = {
	TECH_PARAMS: 'tech_params',           // 技术参数
	PRODUCT_IMAGE: 'product_image',       // 产品图片
	QUALIFICATION: 'qualification',       // 资质文件
	ENTERPRISE_LOGO: 'enterprise_logo',   // 企业Logo
	// ENTERPRISE_LICENSE: 'enterprise_license',  // 营业执照
	// ENTERPRISE_CERT: 'enterprise_cert',   // 认证体系文件
	// ENTERPRISE_AGENT: 'enterprise_agent'  // 代理证书
};

/**
 * 获取上传配置信息
 * @returns {Promise}
 */
export function getUploadConfig() {
	return request.get("upload/config");
}

/**
 * 通用文件上传接口
 * @param {String} filePath - 要上传的文件路径（小程序本地路径）
 * @param {String} scene - 上传场景，使用 UploadScene 枚举
 * @param {Function} onProgressUpdate - 上传进度回调函数（可选）
 * @param {Object} extraData - 额外的表单数据（可选），例如：{ filename: '文件名.pdf' }
 * @returns {Promise}
 */
export function uploadFile(filePath, scene, onProgressUpdate, extraData = {}) {
	return new Promise((resolve, reject) => {
		// 检查登录状态
		if (!store.state.app.token && !checkLogin()) {
			toLogin();
			reject({
				msg: '未登录'
			});
			return;
		}

		// 验证场景参数
		const validScenes = Object.values(UploadScene);
		if (!validScenes.includes(scene)) {
			reject({
				msg: '不支持的上传场景'
			});
			return;
		}

		// 构建请求URL
		const url = `${HTTP_REQUEST_URL}/${API_PREFIX}/upload/file/${scene}`;

		// 设置请求头
		const header = {};
		if (store.state.app.token) {
			header[TOKENNAME] = 'Bearer ' + store.state.app.token;
		}
		if (wx.getStorageSync('locale')) {
			header['Cb-lang'] = wx.getStorageSync('locale');
		}

	// 构建formData，包含额外数据
	const formData = {
		...extraData
	};

	console.log('=== 上传请求 ===');
	console.log('URL:', url);
	console.log('filePath:', filePath);
	console.log('formData:', formData);
	console.log('===============');

	// 执行上传
	const uploadTask = wx.uploadFile({
		url: url,
		filePath: filePath,
		name: 'file',
		header: header,
		formData: formData,
		success: (res) => {
			console.log('=== 上传响应 ===');
			console.log('statusCode:', res.statusCode);
			console.log('response data:', res.data);
			console.log('===============');
				
				try {
					const data = JSON.parse(res.data);
					console.log('解析后的数据:', data);
					
					// 兼容两种返回格式：code 和 status
					const statusCode = data.code || data.status;
					console.log('状态码:', statusCode, '类型:', typeof statusCode);
					
					// 根据返回的status/code判断是否成功
					if (statusCode === 200) {
						console.log('✅ 上传成功');
						// 统一返回格式，将 status 转为 code
						const result = {
							code: 200,
							msg: data.msg,
							data: data.data
						};
						resolve(result);
					} else if ([110002, 110003, 110004].indexOf(statusCode) !== -1) {
						// token失效，跳转登录
						console.log('❌ token失效');
						toLogin();
						reject(data);
					} else {
						console.log('❌ 上传失败:', data.msg);
						reject(data.msg || '上传失败');
					}
				} catch (e) {
					console.error('❌ JSON解析错误:', e);
					console.error('原始响应数据:', res.data);
					reject('上传失败，返回数据格式错误');
				}
			},
			fail: (err) => {
				console.error('❌ wx.uploadFile fail:', err);
				reject('文件上传失败');
			}
		});

		// 监听上传进度
		if (typeof onProgressUpdate === 'function') {
			uploadTask.onProgressUpdate((res) => {
				onProgressUpdate(res);
			});
		}
	});
}

/**
 * 上传技术参数文件
 * @param {String} filePath - 要上传的文件路径
 * @param {Function} onProgressUpdate - 上传进度回调函数（可选）
 * @param {String} filename - 文件名（可选）
 * @returns {Promise}
 */
export function uploadTechParams(filePath, onProgressUpdate, filename) {
	console.log('uploadTechParams 调用:', {
		filePath: filePath,
		filename: filename
	});
	
	const extraData = {};
	if (filename) {
		extraData.filename = filename;
		console.log('设置extraData.filename:', filename);
	} else {
		console.warn('⚠️ 未提供文件名参数');
	}
	
	return uploadFile(filePath, UploadScene.TECH_PARAMS, onProgressUpdate, extraData);
}

/**
 * 上传产品图片
 * @param {String} filePath - 要上传的图片路径
 * @param {Function} onProgressUpdate - 上传进度回调函数（可选）
 * @param {String} filename - 文件名（可选）
 * @returns {Promise}
 */
export function uploadProductImage(filePath, onProgressUpdate, filename) {
	const extraData = {};
	if (filename) {
		extraData.filename = filename;
	}
	return uploadFile(filePath, UploadScene.PRODUCT_IMAGE, onProgressUpdate, extraData);
}

/**
 * 上传资质文件
 * @param {String} filePath - 要上传的文件路径
 * @param {Function} onProgressUpdate - 上传进度回调函数（可选）
 * @param {String} filename - 文件名（可选）
 * @returns {Promise}
 */
export function uploadQualification(filePath, onProgressUpdate, filename) {
	const extraData = {};
	if (filename) {
		extraData.filename = filename;
	}
	return uploadFile(filePath, UploadScene.QUALIFICATION, onProgressUpdate, extraData);
}

/**
 * 批量上传文件
 * @param {Array} filePaths - 文件路径数组
 * @param {String} scene - 上传场景
 * @param {Function} onProgressUpdate - 总体进度回调函数（可选）
 * @returns {Promise}
 */
export function uploadMultipleFiles(filePaths, scene, onProgressUpdate) {
	if (!Array.isArray(filePaths) || filePaths.length === 0) {
		return Promise.reject('文件列表不能为空');
	}

	let completedCount = 0;
	const total = filePaths.length;

	const uploadPromises = filePaths.map((filePath, index) => {
		return uploadFile(filePath, scene, (res) => {
			// 单个文件上传进度
			if (typeof onProgressUpdate === 'function') {
				const overallProgress = Math.floor(
					((completedCount + res.progress / 100) / total) * 100
				);
				onProgressUpdate({
					index,
					fileProgress: res.progress,
					overallProgress,
					completedCount,
					total
				});
			}
		}).then(result => {
			completedCount++;
			return result;
		});
	});

	return Promise.all(uploadPromises);
}

/**
 * 选择并上传图片
 * @param {Object} options - 选择图片的配置
 * @param {Number} options.count - 最多可以选择的图片张数，默认9
 * @param {Array} options.sizeType - 所选的图片的尺寸，默认['original', 'compressed']
 * @param {Array} options.sourceType - 选择图片的来源，默认['album', 'camera']
 * @param {String} scene - 上传场景
 * @param {Function} onProgressUpdate - 上传进度回调函数（可选）
 * @returns {Promise}
 */
export function chooseAndUploadImage(options = {}, scene = UploadScene.PRODUCT_IMAGE, onProgressUpdate) {
	return new Promise((resolve, reject) => {
		wx.chooseImage({
			count: options.count || 9,
			sizeType: options.sizeType || ['original', 'compressed'],
			sourceType: options.sourceType || ['album', 'camera'],
			success: (res) => {
				const tempFilePaths = res.tempFilePaths;
				
				if (tempFilePaths.length === 1) {
					// 单张图片直接上传
					uploadFile(tempFilePaths[0], scene, onProgressUpdate)
						.then(resolve)
						.catch(reject);
				} else {
					// 多张图片批量上传
					uploadMultipleFiles(tempFilePaths, scene, onProgressUpdate)
						.then(resolve)
						.catch(reject);
				}
			},
			fail: (err) => {
				console.error('选择图片失败：', err);
				reject('选择图片失败');
			}
		});
	});
}

/**
 * 选择并上传文件（仅小程序基础库 2.21.0 及以上支持）
 * @param {Object} options - 选择文件的配置
 * @param {Number} options.count - 最多可以选择的文件个数，默认100
 * @param {Array} options.extension - 根据文件拓展名过滤，仅 type==file 时有效
 * @param {String} scene - 上传场景
 * @param {Function} onProgressUpdate - 上传进度回调函数（可选）
 * @returns {Promise}
 */
export function chooseAndUploadFile(options = {}, scene, onProgressUpdate) {
	return new Promise((resolve, reject) => {
		// 检查是否支持 wx.chooseMessageFile
		if (!wx.chooseMessageFile) {
			reject('当前微信版本不支持选择文件功能');
			return;
		}

		wx.chooseMessageFile({
			count: options.count || 1,
			type: options.type || 'file',
			extension: options.extension,
			success: (res) => {
				const tempFilePaths = res.tempFiles.map(file => file.path);
				
				if (tempFilePaths.length === 1) {
					// 单个文件直接上传
					uploadFile(tempFilePaths[0], scene, onProgressUpdate)
						.then(resolve)
						.catch(reject);
				} else {
					// 多个文件批量上传
					uploadMultipleFiles(tempFilePaths, scene, onProgressUpdate)
						.then(resolve)
						.catch(reject);
				}
			},
			fail: (err) => {
				console.error('选择文件失败：', err);
				reject('选择文件失败');
			}
		});
	});
}

